#ifndef __BASIC_MQE_H__
#define __BASIC_MQE_H__

#include <basic/misc.h>

__BEGIN_DECLS

#define MQE_MSG_MAX_SIZE        KB(1024-2)   /* 消息最大尺寸 */

struct _mqe;
typedef struct _mqe *MQE;

/*
 * 创建消息队列
 */
//extern int  /* 0:成功 -1:参数为空 -2:获取消息队列出错
//               -3:共享内存创建出错 -4:挂接共享内存出错 */
//mqe_create(
//        char *queue         /* [IN] 消息队列名称 */
//        );

/*
 * 清理消息队列
 */
extern int  /* 0:成功 -1:获取消息队列出错 -2:清理消息出错 */
mqe_clear(
        char *queue         /* [IN] 消息队列名称 */
        );

/*
 * 挂接消息队列
 */
extern int  /* 0:成功 -1:获取消息队列出错 */
mqe_attach(
        char *queue,	    /* [IN] 消息队列名称 */
        char *self,         /* [IN] 调用者名称 */
        MQE *pmqe           /* [OUT] 消息队列接口 */
        );

/*
 * 脱卸消息队列
 */
extern int  /* 0:成功 */
mqe_detach(
        MQE mpe             /* [IN] 消息队列接口 */
        );

/*
 * 发送消息
 */
extern int	/* 0:成功 -1:发送消息出错 */
mqe_send(
        MQE mqe,            /* [IN] 消息队列接口 */
        char *target,       /* [IN] 接受者名称 */
        unsigned char *msg, /* [IN] 发送消息 */
        int msg_size        /* [IN] 发送消息大小 */
        );

/*
 * 接收消息
 */
extern int	/* 0:成功 -1:接收消息出错
                -2:消息长度小于最小长度 -3:实际消息长度无效
                -4:实际消息长度与接收消息长度不符 */
mqe_recv(
        MQE mqe,            /* [IN] 消息队列接口 */
        char *source,       /* [IN] 发送者名称 */
        unsigned char *msg, /* [OUT] 接收消息 */
        int *msg_size       /* [OUT] 接收消息大小 */
        );

/*
 * 同步调用消息服务
 */
extern int	/* 0:成功 -100+mqe_send错误 -200+mqe_recv错误 */
mqe_syn_call(
        MQE mqe,            /* [IN] 消息队列接口 */
        char *target,       /* [IN] 接受者名称 */
        unsigned char *request, /* [IN] 请求消息 */
        int request_size,   /* [IN] 请求消息大小 */
        unsigned char *respond, /* [OUT] 应答消息 */
        int *respond_size   /* [OUT] 应答消息大小 */
        );

struct mqe_syn_attr
{
    char source[FILE_NM_SIZE+1];
    unsigned int syn;
};
typedef struct mqe_syn_attr MQE_SYN_ATTR;

/*
 * 同步接收消息
 */
extern int	/* 0:成功 -1:接收消息出错
                -2:消息长度小于最小长度 -3:实际消息长度无效
                -4:实际消息长度与接收消息长度不符 */
mqe_syn_fetch(
        MQE mqe,            /* [IN] 消息队列接口 */
        MQE_SYN_ATTR *attr, /* [IN] 同步属性 */
        unsigned char *msg, /* [OUT] 接收消息 */
        int *msg_size       /* [OUT] 接收消息大小 */
        );

/*
 * 同步发送消息
 */
extern int	/* 0:成功 -1:发送消息出错 */
mqe_syn_reply(
        MQE mqe,            /* [IN] 消息队列接口 */
        MQE_SYN_ATTR *attr, /* [IN] 同步属性 */
        unsigned char *msg, /* [IN] 发送消息 */
        int msg_size        /* [IN] 发送消息大小 */
        );

__END_DECLS

#endif
